const { Router } = require('express')

const { User, addUserValidate, editUserValidate } = require('../model/User')

const { Article } = require('../model/Article')

const sexpage = require('mongoose-sex-page')

const { compare, genSalt, hash } = require('bcrypt')

const { uploadFile } = require('../util/upload-file')

const router = Router()

router.get('/', (req, res) => {
  res.send('welcome to admin home page')
})

router.get('/user/list', async (req, res) => {
  // 当前页码
  const { page = 1 } = req.query
  // 每页条数
  const size = 10
  // 总数据条数
  const total = await User.countDocuments()
  // 总页数
  const pages = Math.ceil(total / size)
  const users = await User.find()
    .skip((page - 1) * size)
    .limit(size)
  res.render('admin/user-list', { users, page, pages })
})

router.get('/user/add', (req, res) => {
  res.render('admin/user-add', req.query)
})

router.post('/user/add', async (req, res) => {
  const reqData = req.body

  // 数据验证，如果result的值是true，那么就验证通过，否则都验证不通过，则是捕获到的错误对象
  const result = await addUserValidate(reqData).catch(err => err)

  if (result instanceof Error) {
    // return next({ path: '/admin/user/add', query: { errmsg: result.message } })
    // return next(new Error(`/admin/user/add?errmsg=${result.message}`))
    return res.redirect(`/admin/user/add?errmsg=${result.message}`)
  }

  const user = await User.findOne({ email: reqData.email })

  if (user) {
    // return next({ path: '/admin/user/add', query: { errmsg: '该邮箱已存在' } })
    // return next(new Error(`/admin/user/add?errmsg=该邮箱已存在`))
    return res.redirect(`/admin/user/add?errmsg=该邮箱已存在`)
  }

  // 加密明文密码，并且重新赋值给 reqData.pwd
  reqData.pwd = await hash(reqData.pwd, await genSalt())

  // 添加到数据库中
  await User.create(reqData)

  // 重定向到用户列表页
  res.redirect('/admin/user/list')
})

router.get('/user/edit/:id', async (req, res) => {
  const { id } = req.params
  let { errmsg } = req.query
  let user = await User.findOne({ _id: id }).catch(err => null)
  if (!user) {
    // 这里不能调用res.redirect 重定向到自己了，因为会产生死循环
    errmsg = '找不到该用户'
    user = {}
  }
  res.render('admin/user-edit', { user, errmsg })
})

router.post('/user/edit', async (req, res) => {
  const { id, pwd, ...reqData } = req.body

  let result = await editUserValidate(req.body).catch(err => err)

  if (result instanceof Error) {
    return res.redirect(`/admin/user/edit/${id}?errmsg=${result.message}`)
  }

  const user = await User.findOne({ _id: id }).catch(err => null)
  if (!user) {
    return res.redirect(`/admin/user/edit/${id}?errmsg=找不到该用户`)
  }

  if (!(await compare(pwd, user.pwd))) {
    return res.redirect(`/admin/user/edit/${id}?errmsg=密码错误`)
  }

  result = await User.updateOne({ _id: id }, reqData)

  if (!result.ok) {
    return res.redirect(`/admin/user/edit/${id}?errmsg=服务器异常，请稍后重试`)
  }

  res.redirect('/admin/user/list')
})

router.get('/user/del', async (req, res) => {
  const { id } = req.query
  if (!id) {
    return res.status(400).render('admin/error', { msg: '非法的id' })
  }
  const user = await User.findOneAndDelete({ _id: id }).catch(err => null)
  if (!user) {
    return res.status(400).render('admin/error', { msg: '找不到该用户' })
  }
  res.redirect('/admin/user/list')
})

router.get('/article/list', async (req, res) => {
  const { page = 1 } = req.query

  const data = await sexpage(Article)
    .page(page) // 当前页码
    .size(1) // 每页条数
    .display(5) // 最多展示的页码个数，如果总共有10页，仅返回与当前页码临近的5个页码，如果总共小于5页，那么就只返回这个页码
    .find()
    .populate('author')
    .exec()
  res.render('admin/article-list', data)
})

router.get('/article/add', (req, res) => {
  res.render('admin/article-add')
})

router.post('/article/add', async (req, res) => {
  const result = await uploadFile(req)
  if (!result) {
    return res.status(500).render('admin/error', { msg: '文件上传失败，请检查文件大小（最大20MB）或骚后重试' })
  }

  await Article.create({ ...result.fields, cover: result.files.cover.join(',') })

  res.redirect('/admin/article/list')
})

module.exports = { router }
